package com.bbva.kyfb.kyfbbofo.implement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;
import com.bbva.kyfb.kyfbdtofo.FicheroRequest;
import com.bbva.kyfb.kyfbdtofo.trf.ConsultarDetalleCuentaInDto;
import com.bbva.kyfb.kyfbdtofo.trf.DetalleTransferencia;
import com.bbva.kyfb.kyfbjpatlsb.dominiotlsb.Ttltrtra;
import com.bbva.kyfb.kyfbofo.abstracts.ExecuteTransferBOAbstract;
import com.bbva.kyfb.kyfbofo.interfaces.ExecuteTransactionBO;
import com.bbva.kyfb.kyfbutils.constantes.ConstantesFO;

@Service
public class TransferenciaBO extends ExecuteTransferBOAbstract
		implements ExecuteTransactionBO {
	
	private static final I18nLog Log = I18nLogFactory.getLogI18n(TransferenciaBO.class);
	
	@Autowired
	private ConsultarDetalleCuentaInDto cdc;
	
	@Override
	@Transactional("transactionManagerTLSB")
	protected void beforeTransaction(Object object, FicheroRequest aFicheroRequest) {		
		DetalleTransferencia detalleTransferencia = (DetalleTransferencia) object;
		try {
			// int iLongRefFirma = 9;
			desTransfer = tlsbGeneradorId.generarConLogon(9, aFicheroRequest.getReferencia());
			Ttltrtra tra = traDTO.buildTraEntityForTransferencia(detalleTransferencia, aFicheroRequest, desTransfer);
			getTraDao().insert(tra);
			getTraDao().flush();
		} catch (Exception e) {
			Log.error("Error realizando insert TLTRTRA", e);
		}
	}
	
	@Override
	public void launchTransaction(Object object, FicheroRequest ficheroRequest) {
		
		DetalleTransferencia detalleTransferencia = (DetalleTransferencia) object;
		
		String cuentaDestino = !detalleTransferencia.getEsDestinoLibrePr().equals("N")?
				detalleTransferencia.getCuentaDestinoLibre():detalleTransferencia.getCuentaBeneficiaria();
		
		boolean destinoNacional = obtenerDestino(cuentaDestino);
		
		if(destinoNacional) {
			trfOutDto = accesoHost.relizaTransferenciaNacional(detalleTransferencia, ficheroRequest);
		}
		else {
			trfOutDto = accesoHost.relizaTransferenciaInternacional(detalleTransferencia, ficheroRequest);
		}	
	}
	
	@Override
	@Transactional("transactionManagerTLSB")
	protected void afterTransaction(Object object) {		
		DetalleTransferencia detalleTransferencia = (DetalleTransferencia) object;
		String codError = trfOutDto.getCodError();		
		try {
			Ttltrtra tra = traDTO
					.buildTraUpdateEntityForTransferencia(desTransfer,trfOutDto);
			getTraDao().update(tra);
			getTraDao().flush();
		} catch (Exception e) {
			Log.error("Error realizando update TLTRTRA", e);
		}
			
		if("000".equals(codError)) {
			try {				
				String cuentaDestino = !detalleTransferencia.getEsDestinoLibrePr().equals("N")?
						detalleTransferencia.getCuentaDestinoLibre():detalleTransferencia.getCuentaBeneficiaria();
						
				String email = detalleTransferencia.getEmailBenf();
				String movil = detalleTransferencia.getTlfBenef();
				String importe = detalleTransferencia.getImporte();
				
				if(email != null && !email.isEmpty() || movil != null && !movil.isEmpty()) {
					String sOrdenante = "";
					buildConsultaDetalleCuentaDto(detalleTransferencia);					
					sOrdenante = accesoHost.consultarDetalleCuenta(cdc).getTitular();
					
					if (email != null && !email.isEmpty()) {
						envioEmail(email, cuentaDestino, sOrdenante, importe);
					}
					if (movil != null && !movil.isEmpty()) {
						envioSms(movil, cuentaDestino, sOrdenante, importe);
					}
				}
			} catch (Exception e1) {
				Log.error("Error notificando transferencia al beneficiario", e1);
			}			
			getResponseDto().setAssistantCodError(ConstantesFO.COD_ERROR_SUCCESSFUL);
		}
		else {
			getResponseDto().setAssistantCodError(ConstantesFO.COD_ERROR);
		}
	}

	private void buildConsultaDetalleCuentaDto(
			DetalleTransferencia detalleTransferencia) {		
		cdc.setBanco(detalleTransferencia.getCodBancoOrdenante());
		cdc.setOficina(detalleTransferencia.getCodOficinaOrdenante());
		cdc.setFolio(detalleTransferencia.getCodFolioOrdenante());
		cdc.setContrapartida(detalleTransferencia.getCodContraPartidaOrdenante());
		cdc.setTitularCta(ConstantesFO.COD_NUM_UNO);
		cdc.setDomicilioPostal(ConstantesFO.COD_NUM_ZERO);
		cdc.setCtasRelacionadas(ConstantesFO.COD_NUM_UNO);
	}

	private boolean obtenerDestino(String cuentaDestino) {		
		return cuentaDestino.startsWith("ES")?true:false;
	}
	
	private void envioSms(String movil, String cuentaDestino, String sOrdenante, String importe) {
		//Servicio Para envio de SMS
	}

	private void envioEmail(String email, String cuentaDestino, String sOrdenante, String importe) {
		//Servicio Para envio de Email
	}
	
}
